package model

import "github.com/jinzhu/gorm"

type Article struct {
	Model

	Title         string `json:"title"`              // 标题
	Desc          string `json:"desc"`               // 文章简述
	CoverImageUrl string `json:"cover_image_url"`    // 封面图片
	Content       string `json:"-" gorm:"type:text"` // 正文
	State         uint8  `json:"state"`              // 状态 0：禁用，1启用

	AuthId uint  `json:"auth_id"` // 用户
	Auth   *Auth `json:"auth"`

	Tags []ArticleTag `json:"tags"`

	CategoryId uint      `json:"category_id"` // 分类
	Category   *Category `json:"category"`

	WXSync bool `json:"wx_sync"` // 微信公众号 同步状态
}

type ArticleContent struct {
	Model

	Title         string `json:"title"`                    // 标题
	Desc          string `json:"desc"`                     // 文章简述
	CoverImageUrl string `json:"cover_image_url"`          // 封面图片
	Content       string `json:"content" gorm:"type:text"` // 正文
	State         uint8  `json:"state"`                    // 状态 0：禁用，1启用

	AuthId uint  `json:"auth_id"` // 用户
	Auth   *Auth `json:"auth"`

	Tags []ArticleTag `json:"tags"`

	CategoryId uint      `json:"category_id"` // 分类
	Category   *Category `json:"category"`

	WXSync bool `json:"wx_sync"` // 微信公众号 同步状态
}

func (a Article) TableName() string {
	return "article"
}

func (a ArticleContent) TableName() string {
	return "article"
}

func (a *Article) Create(tx *gorm.DB) error {
	return tx.Create(a).Error
}

func (a *Article) Update(tx *gorm.DB, values map[string]interface{}) error {
	return tx.Table(a.TableName()).Where("id = ?", a.Id).Updates(values).Error
}

func (a *Article) List(tx *gorm.DB, limit, offset int) (articles []Article, total int, err error) {
	if err := tx.Limit(limit).Offset(offset).Order("id desc").Find(&articles).Error; err != nil {
		return nil, 0, err
	}

	tx.Table(a.TableName()).Count(&total)

	return articles, total, nil
}

func (a *ArticleContent) QueryById(tx *gorm.DB) error {
	if err := tx.Where("id = ?", a.Id).First(a).Error; err != nil {
		return err
	}

	var tags []ArticleTag
	tx.Where("article_id = ?", a.Id).Preload("Tag").Find(&tags)
	a.Tags = tags
	return nil
}

func (a *Article) Search(tx *gorm.DB, search string) (articles []Article, err error) {
	if err := tx.
		Where("title like ?", "%"+search+"%").
		Or("`desc` like ?", "%"+search+"%").
		Or("content like ?", "%"+search+"%").
		Limit(20).Order("id desc").Find(&articles).Error; err != nil {
		return nil, err
	}

	return articles, nil
}

func (a *Article) Delete(tx *gorm.DB) error {
	return tx.Delete(a, "id = ?", a.Id).Error
}
